{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "THN-pFmXLq_x"
   },
   "source": [
    "# Stock Price Prediction\n",
    "\n",
    "In this notebook, we demonstrate a reference use case where we use historical stock price data to predict the future price. The dataset we use is the daily stock price of S&P500 stocks during 2013-2018 ([data source](https://www.kaggle.com/camnugent/sandp500/)). We demostrate how to do univariate forecasting using the past 80% of the total days' MMM price to predict the future 20% days' daily price.\n",
    "\n",
    "Reference: https://github.com/jwkanggist/tf-keras-stock-pred\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2LLu44mMwCTN"
   },
   "source": [
    "## Get Data\n",
    "\n",
    "We will use the close prices of MMM stock for our experiment. We will \n",
    "  1. download raw dataset and load into dataframe. \n",
    "  2. Extract the close prices of MMM stock from the dataframe into a numpy array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "IwF7ovI0Lq_-"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "wUYapsflLq__",
    "outputId": "c5385ba6-6ece-448d-a5a1-c51fb8d71f06"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data/all_stocks_5yr.csv\n"
     ]
    }
   ],
   "source": [
    "# S&P 500\n",
    "FILE_NAME    = 'all_stocks_5yr.csv'\n",
    "SOURCE_URL   = 'https://github.com/CNuge/kaggle-code/raw/master/stock_data/' \n",
    "\n",
    "filepath = './data/'+ FILE_NAME\n",
    "filepath = os.path.join('data', FILE_NAME)\n",
    "print(filepath)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "mJ44xd7nLrAA"
   },
   "outputs": [],
   "source": [
    "# download data\n",
    "!if ! [ -d \"data\" ]; then mkdir data; cd data; wget https://github.com/CNuge/kaggle-code/raw/master/stock_data/individual_stocks_5yr.zip; wget https://raw.githubusercontent.com/CNuge/kaggle-code/master/stock_data/merge.sh; chmod +x merge.sh; unzip individual_stocks_5yr.zip; ./merge.sh; fi\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "dMefLEwXLrAB",
    "outputId": "0007508f-de13-46ab-849a-235fb4b4d404"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         date   open   high    low  close    volume Name\n",
      "0  2013-02-08  15.07  15.12  14.63  14.75   8407500  AAL\n",
      "1  2013-02-11  14.89  15.01  14.26  14.46   8882000  AAL\n",
      "2  2013-02-12  14.45  14.51  14.10  14.27   8126000  AAL\n",
      "3  2013-02-13  14.30  14.94  14.25  14.66  10259500  AAL\n",
      "4  2013-02-14  14.94  14.96  13.16  13.99  31879900  AAL\n",
      "5  2013-02-15  13.93  14.61  13.93  14.50  15628000  AAL\n",
      "6  2013-02-19  14.33  14.56  14.08  14.26  11354400  AAL\n",
      "7  2013-02-20  14.17  14.26  13.15  13.33  14725200  AAL\n",
      "8  2013-02-21  13.62  13.95  12.90  13.37  11922100  AAL\n",
      "9  2013-02-22  13.57  13.60  13.21  13.57   6071400  AAL\n",
      "              date    open      high       low   close   volume Name\n",
      "381385  2013-02-08  102.34  103.3300  102.0400  102.66  1937721  MMM\n",
      "381386  2013-02-11  102.39  102.8800  102.0401  102.62  1715444  MMM\n",
      "381387  2013-02-12  102.66  103.5900  102.6300  103.46  1927930  MMM\n",
      "381388  2013-02-13  103.03  103.3950  102.5800  102.86  1699804  MMM\n",
      "381389  2013-02-14  102.43  103.1400  102.2200  102.78  2217419  MMM\n",
      "381390  2013-02-15  103.06  103.3800  102.6200  103.23  2326159  MMM\n",
      "381391  2013-02-19  103.42  104.3916  103.3200  104.18  2988487  MMM\n",
      "381392  2013-02-20  104.18  104.4000  103.1500  103.15  2997192  MMM\n",
      "381393  2013-02-21  102.88  103.1400  102.3900  102.72  2758728  MMM\n",
      "381394  2013-02-22  102.99  103.7000  102.8200  103.54  2158013  MMM\n"
     ]
    }
   ],
   "source": [
    "# read data\n",
    "data = pd.read_csv(filepath)\n",
    "print(data[:10])\n",
    "\n",
    "target_rows = data[data['Name']=='MMM']\n",
    "print(target_rows[:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "j6OfgfNDLrAC",
    "outputId": "23fd8f13-d920-4217-f85b-1b4f90a7503c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[102.66]\n",
      " [102.62]\n",
      " [103.46]\n",
      " [102.86]\n",
      " [102.78]\n",
      " [103.23]\n",
      " [104.18]\n",
      " [103.15]\n",
      " [102.72]\n",
      " [103.54]]\n"
     ]
    }
   ],
   "source": [
    "# extract close value\n",
    "close_val = target_rows[['close']].values\n",
    "print(close_val[:10])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEGCAYAAACKB4k+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3dd3hUZfbA8e8BIggiRYJUDbqAqIgUaQqiuBZWwS6sBYGVVWy49vKzrGWxra5rW1xdRFmwIWAXsSGKbkCkIygoIEJQ6Z2c3x/vvbl3kkwySaaG83mePPfOe+/ceSeBOXPfcl5RVYwxxhiAKqmugDHGmPRhQcEYY0wBCwrGGGMKWFAwxhhTwIKCMcaYAtVSXYGKaNCggebk5KS6GsYYk1FmzJixVlWzizuW0UEhJyeH3NzcVFfDGGMyioj8EO2YNR8ZY4wpYEHBGGNMAQsKxhhjCiSsT0FEmgOjgf0BBUaq6j+8Y1cClwO7gbdU9Qav/GZgiFd+laq+V9bX3blzJytWrGDbtm3xeSOmUqtRowbNmjUjKysr1VUxJi0ksqN5F3Ctqs4UkdrADBGZjAsS/YB2qrpdRBoCiMihQH/gMKAJ8IGItFLV3WV50RUrVlC7dm1ycnIQkbi+IVO5qCq//PILK1asoEWLFqmujjFpIWHNR6q6SlVnevsbgQVAU+AyYISqbveOrfGe0g8Yp6rbVXUpsAToXNbX3bZtG/vtt58FBFMqEWG//fazu0pjQpLSpyAiOUB74EugFdBDRL4UkU9E5CjvtKbA8tDTVnhl5Xm98lfW7FHs34oxkRIeFERkH+A1YLiqbsA1WdUHugLXAy9LGf5nishQEckVkdy8vLyE1NkYY9LR5MmwZEliXyOhQUFEsnABYYyqjveKVwDj1fkKyAcaACuB5qGnN/PKIqjqSFXtpKqdsrOLnZCXciLCBRdcUPB4165dZGdnc+qppwIwatQoRIQPPvig4JwJEyYgIrz66qsA9OrViwMOOIDwehenn346++yzT6mvf+edd/LQQw+VeM7TTz/N6NGjAbj44osLXjeeJk2axIgRIyp8nV69etG6dWvatWvHUUcdxaxZs+JQO2Myz4knQsuWiX2NhAUF79v/s8ACVf176NAE4DjvnFbAXsBaYBLQX0Sqi0gLoCXwVaLql0i1atVi7ty5bN26FYDJkyfTtGlkS1jbtm0ZN25cweOxY8fSrl27iHPq1q3LtGnTAFi3bh2rVq2KWx0vvfRSLrroorhdr7Bdu3bRt29fbrrpprhcb8yYMXzzzTcMGzaM66+/Pi7XNMYUlcg7haOBC4HjRWSW99MHeA44SETmAuOAgd5dwzzgZWA+8C5weVlHHqWTPn368NZbbwHuA3/AgAERx3v06MFXX33Fzp072bRpE0uWLOHII4+MOKd///4FgWP8+PGceeaZUV/v3nvvpVWrVhxzzDEsWrSooPyZZ57hqKOOol27dpx11lls2bIFKP5u4sMPP+T0008veDx58mTOOOOMIq+Vk5PDDTfcQNu2bencuTNLvPvZiy++mEsvvZQuXbpwww03MGrUKK644goAVq9ezRlnnEG7du1o164dn3/+OQAvvvginTt35sgjj+TPf/4zu3eX/Cfv1q0bK1e6G8hNmzbRu3dvOnToQNu2bZk4cSIADz74II899hgA11xzDccff3zB+zv//PNLvL4x6SpZi2QmbEiqqn4GROsruKC4QlW9F7g3XnUYPhzi3dJw5JHw6KOln9e/f3/++te/cuqppzJ79mwGDx7M1KlTC46LCCeccALvvfce69evp2/fvixdujTiGr179+aSSy5h9+7djBs3jpEjR3L33XcXea0ZM2Ywbtw4Zs2axa5du+jQoQMdO3YE4Mwzz+SSSy4B4LbbbuPZZ5/lyiuvLLbOxx13HMOGDSMvL4/s7Gz+85//MHjw4GLPrVOnDnPmzGH06NEMHz6cN998E3BDgj///HOqVq3KqFGjCs6/6qqrOPbYY3n99dfZvXs3mzZtYsGCBbz00ktMmzaNrKwshg0bxpgxY0q8g3n33XcLAleNGjV4/fXX2XfffVm7di1du3alb9++9OjRg4cffpirrrqK3Nxctm/fzs6dO5k6dSo9e/aMem1j0tnOncl5nYxOiJfOjjjiCJYtW8bYsWPp06dPsef079+fxx57jPXr1/Pwww9z3333RRyvWrUqxxxzDOPGjWPr1q1Eywg7depUzjjjDGrWrAlA3759C47NnTuX2267jXXr1rFp0yZOOumkqHUWES688EJefPFFBg0axBdffFHQ71CYf+czYMAArrnmmoLyc845h6pVqxY5/8MPPyy4VtWqValTpw4vvPACM2bM4Kij3AC0rVu30rBh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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize data\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(close_val, color='blue', label='MMM daily price Raw')\n",
    "plt.xlabel(\"Time Period\")\n",
    "plt.ylabel(\"Stock Price\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_dD-qd0Z8JGC"
   },
   "source": [
    "## Data Pre-processing\n",
    "Now we need to do data cleaning and preprocessing on the raw data. Note that this part could vary for different dataset.\n",
    "\n",
    "For the stock price data we're using, the processing contains 2 parts:\n",
    "\n",
    "1.   Data normalization such that the normalized stock prices fall in the range of 0 to 1\n",
    "2.   Extract time series of given window size\n",
    "\n",
    "We generate a built-in TSDataset to complete the whole processing.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((958, 50, 1), (958, 1, 1), (201, 50, 1), (201, 1, 1))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from bigdl.chronos.data import TSDataset\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "\n",
    "df = target_rows[['date', 'close']]\n",
    "tsdata_train, _, tsdata_test = TSDataset.from_pandas(df, dt_col=\"date\", target_col=\"close\", with_split=True, test_ratio=0.2)\n",
    "minmax_scaler = MinMaxScaler()\n",
    "\n",
    "for tsdata in [tsdata_train, tsdata_test]:\n",
    "    tsdata.scale(minmax_scaler, fit=(tsdata is tsdata_train))\\\n",
    "          .roll(lookback=50, horizon=1)\n",
    "\n",
    "X_train, y_train = tsdata_train.to_numpy()\n",
    "X_test, y_test = tsdata_test.to_numpy()\n",
    "X_train.shape, y_train.shape, X_test.shape, y_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6fT-WKaB8Q5N"
   },
   "source": [
    "## Time series forecasting\n",
    "\n",
    "We use LSTMForecaster for forecasting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "vrf48pWH_Vaf"
   },
   "outputs": [],
   "source": [
    "from bigdl.chronos.forecaster.lstm_forecaster import LSTMForecaster"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "eCgIOQQK_YDS"
   },
   "source": [
    "First we initiate a LSTMForecaster.\n",
    "\n",
    "\n",
    "*   `feature_dim` should match the dimension of the input data, so we just use the last dimension of train input data shape\n",
    "*   `target_dim` equals the dimension of the output data, here we set `target_dim=1` for univariate forecasting.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "QR04YjGiLrAE"
   },
   "outputs": [],
   "source": [
    "# Hyperparameters\n",
    "feature_dim = X_train.shape[-1]\n",
    "target_dim = 1\n",
    "hidden_dim = 10\n",
    "learning_rate = 0.01\n",
    "batch_size = 16\n",
    "epochs = 50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "2DE_F4ltLrAF",
    "outputId": "7448bb5b-78a7-4e20-d0b7-a944483297ce"
   },
   "outputs": [],
   "source": [
    "# build model\n",
    "forecaster = LSTMForecaster(past_seq_len=X_train.shape[1],\n",
    "                            input_feature_num=feature_dim,\n",
    "                            output_feature_num=target_dim,\n",
    "                            hidden_dim=32,\n",
    "                            lr=learning_rate,\n",
    "                            )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tGhlYHGKA1Jw"
   },
   "source": [
    "\n",
    "Then we use fit to train the model. Wait sometime for it to finish."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "id": "pYknEGOMAziH",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/junweid/anaconda3/envs/automl/lib/python3.6/site-packages/torch/nn/modules/rnn.py:63: UserWarning: dropout option adds dropout after all but last recurrent layer, so non-zero dropout expects num_layers greater than 1, but got dropout=0.1 and num_layers=1\n",
      "  \"num_layers={}\".format(dropout, num_layers))\n",
      "Loss: 0.0014435581397265196: 100%|██████████| 60/60 [00:00<00:00, 121.85it/s]\n",
      "Loss: 0.0005991253419779241: 100%|██████████| 60/60 [00:00<00:00, 126.10it/s] \n",
      "Loss: 0.001463871798478067: 100%|██████████| 60/60 [00:00<00:00, 129.16it/s]  \n",
      "Loss: 0.000744112825486809: 100%|██████████| 60/60 [00:00<00:00, 129.33it/s]  \n",
      "Loss: 0.0004986306303180754: 100%|██████████| 60/60 [00:00<00:00, 129.11it/s] \n",
      "Loss: 0.000423654040787369: 100%|██████████| 60/60 [00:00<00:00, 129.26it/s]  \n",
      "Loss: 0.000878160004504025: 100%|██████████| 60/60 [00:00<00:00, 130.28it/s]  \n",
      "Loss: 0.0006411454523913562: 100%|██████████| 60/60 [00:00<00:00, 125.59it/s] \n",
      "Loss: 0.0005283094360493124: 100%|██████████| 60/60 [00:00<00:00, 129.02it/s] \n",
      "Loss: 0.0005987994954921305: 100%|██████████| 60/60 [00:00<00:00, 129.25it/s] \n",
      "Loss: 0.00020524687715806067: 100%|██████████| 60/60 [00:00<00:00, 129.80it/s]\n",
      "Loss: 0.0003135329170618206: 100%|██████████| 60/60 [00:00<00:00, 127.05it/s] \n",
      "Loss: 0.0004632541094906628: 100%|██████████| 60/60 [00:00<00:00, 126.65it/s] \n",
      "Loss: 0.0003457982966210693: 100%|██████████| 60/60 [00:00<00:00, 125.66it/s] \n",
      "Loss: 0.0003034889232367277: 100%|██████████| 60/60 [00:00<00:00, 129.22it/s] \n",
      "Loss: 0.0007945731631480157: 100%|██████████| 60/60 [00:00<00:00, 129.04it/s] \n",
      "Loss: 0.0006156694144010544: 100%|██████████| 60/60 [00:00<00:00, 129.31it/s] \n",
      "Loss: 0.0005662561161443591: 100%|██████████| 60/60 [00:00<00:00, 129.23it/s] \n",
      "Loss: 0.00020602862059604377: 100%|██████████| 60/60 [00:00<00:00, 129.39it/s]\n",
      "Loss: 0.0004572903853841126: 100%|██████████| 60/60 [00:00<00:00, 129.24it/s] \n",
      "Loss: 0.00016504839004483074: 100%|██████████| 60/60 [00:00<00:00, 129.91it/s]\n",
      "Loss: 0.00017932752962224185: 100%|██████████| 60/60 [00:00<00:00, 127.15it/s]\n",
      "Loss: 0.00016090097778942436: 100%|██████████| 60/60 [00:00<00:00, 129.12it/s]\n",
      "Loss: 0.0004442939243745059: 100%|██████████| 60/60 [00:00<00:00, 129.32it/s] \n",
      "Loss: 0.0006332009215839207: 100%|██████████| 60/60 [00:00<00:00, 129.27it/s] \n",
      "Loss: 0.0009257100173272192: 100%|██████████| 60/60 [00:00<00:00, 129.20it/s] \n",
      "Loss: 0.00025288722827099264: 100%|██████████| 60/60 [00:00<00:00, 129.22it/s]\n",
      "Loss: 0.0002799437497742474: 100%|██████████| 60/60 [00:00<00:00, 129.23it/s] \n",
      "Loss: 0.00011286600056337193: 100%|██████████| 60/60 [00:00<00:00, 129.22it/s]\n",
      "Loss: 0.0003576242015697062: 100%|██████████| 60/60 [00:00<00:00, 129.14it/s] \n",
      "Loss: 0.00034720651456154883: 100%|██████████| 60/60 [00:00<00:00, 129.24it/s]\n",
      "Loss: 0.00019558171334210783: 100%|██████████| 60/60 [00:00<00:00, 129.30it/s]\n",
      "Loss: 0.00029517352231778204: 100%|██████████| 60/60 [00:00<00:00, 129.22it/s]\n",
      "Loss: 0.000409148633480072: 100%|██████████| 60/60 [00:00<00:00, 129.29it/s]  \n",
      "Loss: 0.000219602559809573: 100%|██████████| 60/60 [00:00<00:00, 128.89it/s]  \n",
      "Loss: 0.00016235005750786513: 100%|██████████| 60/60 [00:00<00:00, 129.36it/s]\n",
      "Loss: 0.0002849093289114535: 100%|██████████| 60/60 [00:00<00:00, 129.29it/s] \n",
      "Loss: 0.00019198792870156467: 100%|██████████| 60/60 [00:00<00:00, 129.26it/s]\n",
      "Loss: 0.00028496389859355986: 100%|██████████| 60/60 [00:00<00:00, 129.12it/s]\n",
      "Loss: 0.00026053053443320096: 100%|██████████| 60/60 [00:00<00:00, 129.25it/s]\n",
      "Loss: 0.00035288112121634185: 100%|██████████| 60/60 [00:00<00:00, 129.19it/s]\n",
      "Loss: 0.0003559606266207993: 100%|██████████| 60/60 [00:00<00:00, 129.67it/s] \n",
      "Loss: 0.0011709547834470868: 100%|██████████| 60/60 [00:00<00:00, 126.12it/s] \n",
      "Loss: 0.0003389283374417573: 100%|██████████| 60/60 [00:00<00:00, 129.23it/s] \n",
      "Loss: 0.00026698416331782937: 100%|██████████| 60/60 [00:00<00:00, 121.37it/s]\n",
      "Loss: 0.0005201487219892442: 100%|██████████| 60/60 [00:00<00:00, 131.32it/s] \n",
      "Loss: 0.00044692872324958444: 100%|██████████| 60/60 [00:00<00:00, 129.57it/s]\n",
      "Loss: 0.0004146682913415134: 100%|██████████| 60/60 [00:00<00:00, 129.16it/s] \n",
      "Loss: 0.00040588967385701835: 100%|██████████| 60/60 [00:00<00:00, 129.33it/s]\n",
      "Loss: 0.00028104399098083377: 100%|██████████| 60/60 [00:00<00:00, 129.21it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 3min 54s, sys: 411 ms, total: 3min 55s\n",
      "Wall time: 23.5 s\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mse': 0.00035006429045537625}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%%time\n",
    "forecaster.fit(data=(X_train, y_train), batch_size=batch_size, epochs=epochs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "pW40LT8KBJe6"
   },
   "source": [
    "\n",
    "After training is finished. You can use the forecaster to do prediction and evaluation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "id": "NA8Wuuo7BPno"
   },
   "outputs": [],
   "source": [
    "# make prediction\n",
    "y_pred = forecaster.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since we have used standard scaler to scale the input data (including the target values), we need to inverse the scaling on the predicted values too."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred_unscale = tsdata_test.unscale_numpy(y_pred)\n",
    "y_test_unscale = tsdata_test.unscale_numpy(y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5STThUzKBclt"
   },
   "source": [
    "Calculate the mean square error."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "id": "KTMc01PnBjBT"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "mean_squared error is 13.068279890736278\n"
     ]
    }
   ],
   "source": [
    "# evaluate with mean_squared_error\n",
    "from bigdl.orca.automl.metrics import Evaluator\n",
    "print(\"mean_squared error is\", Evaluator.evaluate(\"mse\", y_test_unscale, y_pred_unscale, multioutput='uniform_average'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "C-hVQsz7BtXP"
   },
   "source": [
    "Visualize the prediction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "id": "gGYlj52oBs4N"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot predictions\n",
    "plt.plot(y_test_unscale[:, :, 0], color='blue', label=\"MMM daily price Raw\")\n",
    "plt.plot(y_pred_unscale[:, :, 0], color='red', label=\"MMM daily price Predicted\")\n",
    "plt.xlabel(\"Time Period\")\n",
    "plt.ylabel(\"Normalized Stock Price\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "stock_prediction.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
